/*******************************************************************************
 * @brief: 系统初始化接口
 * @Author:   aple
 * @Date: 2022-10-27 13:54:18
 * @LastEditors: aple
 * @LastEditTime: 2022-10-28 08:03:04
 * @Verision: 1.0.0.0
 ******************************************************************************/

#ifndef __SYSTEM_INIT_H__
#define __SYSTEM_INIT_H__

#include "cc_cfg.h"

#ifdef __cplusplus
extern "C"
{
#endif

/*******************************************************************************
 * @brief  initialization export
 *******************************************************************************/
#define SYS_APP_SECTION_DEF

	typedef void (*sys_init_fn)(void);

#define OBJ_INIT_EXPORT(fn, level) \
	void fn(void);                 \
	OBJ_USED const sys_init_fn __sys_init_##fn OBJ_SECTION(".app_fn.obj." level) = fn

/*******************************************************************************
 * @brief  board init routines will be called in board_init() function
 *******************************************************************************/
#define obj_init_cpu(fn) OBJ_INIT_EXPORT(fn, "1")
#define obj_init_hal(fn) OBJ_INIT_EXPORT(fn, "2")
#define obj_init_env(fn) OBJ_INIT_EXPORT(fn, "3")
#define obj_init_sys(fn) OBJ_INIT_EXPORT(fn, "4")
#define obj_init_app(fn) OBJ_INIT_EXPORT(fn, "5")
#define obj_app_order(fn) OBJ_INIT_EXPORT(fn, "7")

/*******************************************************************************
 * @brief  board init routines will be called in board_init() function
 *******************************************************************************/
#define INIT_EXPORT_CPU obj_init_cpu // CPU 初始化。时钟、心跳、IO等
#define INIT_EXPORT_HAL obj_init_hal // 板载硬件初始化
#define INIT_EXPORT_ENV obj_init_env // 环境初始化
#define INIT_EXPORT_SYS obj_init_sys // 系统级初始化，如加载参数, 系统配置等
#define INIT_EXPORT_APP obj_init_app // 应用级初始化
#define APP_LIST_EXPORT obj_app_order	   // 应用列表

/*******************************************************************************
 * @brief  extern function
 *******************************************************************************/
#define SYS_APP_API_DEFINE

	void sys_app_init(void);
	void sys_app_run(void);
	void sys_app_run_once(void);

	/*******************************************************************************
	 *                                   EOF
	 *******************************************************************************/

#ifdef __cplusplus
}
#endif

#endif
